﻿// Learn more about F# at http://fsharp.net

open System
open System.Data.SqlClient
open System.IO

open Lilium.Data.Csv.Reader
open Lilium.Prelude
open Lilium.String

// требуется трансформация ридера - когда из одного набора полей получается другой набор полей.
// при этом не все поля ридера участвуют в наборе.
// т.е. для части идет трансформация id <исходное_поле>, для части - функция [<исходное_поле>]

// чтение строки было бы неплохо оформить в виде комбинаторного парсера, но проблема в том,
// что допускается переупорядочивание столбцов.

let createReader =

    // поля определяются аппликативно, а мэппятся через wf-билдер

    let iisQuard        =   guard (fun s -> not(String.IsNullOrWhiteSpace(s)) && s <> "-")

    let idField         =   constField null

    let dateField       =   (fun dateStr -> DateTime.Parse(dateStr)) <@> (iisQuard (field "date"))
    let timeField       =   (fun timeStr -> DateTime.Parse(timeStr)) <@> (iisQuard (field "time"))
    let dateTimeField'  =   ((fun (date : DateTime) (time : TimeSpan) -> date.Add(time)) <@> (dateField <*> timeField))
                            <|> dateField

    
    ()

let createIISLogReader (fileName : string) = 
    let streamReader =  new StreamReader(fileName)
    let mutable line = streamReader.ReadLine ()
    while not(String.IsNullOrWhiteSpace(line)) && line.[0] = '#' do
        match line with
        | StartsWith "#Fields:" fieldsStr
            ->  let fields = fieldsStr.Split([|' '|], StringSplitOptions.RemoveEmptyEntries)
                
                undefined () // инициализировать поля
        | _ ->  line <- streamReader.ReadLine () // пропускаем неизвестныйкоментарий.

    Lilium.Data.Csv.Reader.create

let loadLogs path = 
    
    let loadLog fileName = 
        let options = SqlBulkCopyOptions.Default
        use bulkCopy = new SqlBulkCopy ("Data Source=.\SQLExpress;Initial Catalog=Work;Integrated Security=True;Pooling=False", options)
        bulkCopy.DestinationTableName <- "IISLog"
        use reader = createIISLogReader fileName
        bulkCopy.WriteToServer reader

    Directory.EnumerateFiles(path, "*.log") 
        |> Seq.sort 
        |> Seq.iter (fun fileName -> loadLog fileName)

let main =
     loadLogs @"..\..\21102010"